"""
CLI часы и таймер.

Author: Milinuri Nirvalen
Ver: 1.1.2 (4)
"""

from chiori import Ui, Plugin, Config
import datetime
import time


p = Plugin(name='часы и таймер', backend='cli',
	desc='цифровые часы для терминала')

# список с элементами для отрисовки.
simbols = {
	"0":[' ██████╗ ','██╔═████╗','██║██╔██║','████╔╝██║','╚██████╔╝',' ╚═════╝ '],
	"1":[' ██╗', '███║', '╚██║', ' ██║', ' ██║', ' ╚═╝'],
	"2":['██████╗ ','╚════██╗', ' █████╔╝', '██╔═══╝ ', '███████╗', '╚══════╝'],
	"3":['██████╗ ', '╚════██╗',' █████╔╝', ' ╚═══██╗', '██████╔╝', '╚═════╝ '],
	"4":['██╗  ██╗', '██║  ██║', '███████║', '╚════██║', '     ██║', '     ╚═╝'],
	"5":['███████╗', '██╔════╝', '███████╗', '╚════██║', '███████║', '╚══════╝'],
	'6':[' ██████╗ ', '██╔════╝ ', '███████╗ ', '██╔═══██╗', '╚██████╔╝', ' ╚═════╝ '],
	'7':['███████╗', '╚════██║', '   ██╔╝╚', '  ██╔╝  ', '  ██║   ', '  ╚═╝   '],
	"8":[' █████╗ ', '██╔══██╗', ' █████╔╝', '██╔══██╗', '╚█████╔╝', ' ╚════╝ '],
	"9":[' █████╗ ', '██╔══██╗', '╚██████║', ' ╚═══██║', ' █████╔╝', ' ╚════╝ '],
	':':['   ', '██╗', '╚═╝', '██╗', '╚═╝', '   '],
	'(':[' ██╗', '██╔╝', '██║ ', '██║ ', '╚██╗', ' ╚═╝'],
	')':['██╗ ', '╚██╗', ' ██║', ' ██║', '██╔╝', '╚═╝'],
	' ':['    ', '    ', '    ', '    ', '    ', '    ']}


def draw_nums(nums='', center=True):
	# функция отрисовки часов
	u = Ui('clock')

	if not nums:
		nums = datetime.datetime.now().strftime("%H:%M:%S")
	time_now = [x for x in nums]

	# определяем цвета для отрисовки.
	c = u.gray
	lc = u.white

	# получение символов
	pos = []
	for x in time_now:
		pos.append(simbols.get(x, ['', '', '', '', '', '']))

	if center:
		len_time_string = len(pos)-1
		for x in pos:
			len_time_string += len(x[0])
		sep = ' ' * round((u.size[0] - len_time_string)/2)
	else:
		sep = ''

	if len_time_string < u.size[0]:
		for x in range(0,6):
			if x < 3:
				color = lc
			else:
				color = c

			print(sep+color, end='')
			for xx in pos:
				print(xx[x], end=' ')
			print(u.reset)


def get_seconds(str_time=""):
	if not str_time:
		str_time = datetime.datetime.now().strftime("%H %M %S")

	seconds = 0
	i = -1
	for x in str_time.split()[::-1]:
		i += 1
		if x.isdigit():
			if not i:
				seconds += int(x)
			else:
				seconds += int(x)*60**i

	return seconds


def render_timer(u):
	c = Config('timer', ["6 0 0", "12 0 0", "17 30 0", "19 0 0", "22 0 0"]).group_data
	c.append('24 0 0')
	now_seconds = get_seconds()

	first = False
	for x in c:
		seconds = get_seconds(x)
		if seconds < now_seconds:
			continue

		if not first:
			draw_nums(f'{seconds-now_seconds} ({round((seconds-now_seconds)/60)})')
			first = True

		u.progress_bar(now_seconds, seconds, x, seconds-now_seconds)


# commands
# ========

@p.command('<a(uto) timer>', usage='непрерывный отрисовка таймера')
async def autoRenderTimer(event, ctx):
	while True:
		u = Ui()
		u.clear()
		render_timer(u)
		time.sleep(1)


@p.command('<d(raw) timer>', usage='единожды отрисовать таймер')
async def renderTimer(event, ctx):
	render_timer(Ui())


@p.command('<d(raw) time/clock>', usage='единожды отрисовать часы')
async def renderClock(event, ctx):
	draw_nums()


@p.command('<a(uto) time/clock>', usage='непрерывная отрисовка часов')
async def autoRenderClock(event, ctx):
	while True:
		Ui().clear()
		draw_nums()
		time.sleep(1)

